package br.sddp.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import br.sddp.modelo.Usuario;
import br.sddp.util.JPAUtil;
import br.sddp.util.TratadorExceptions;

/**
 * Classe que implementa as operacoes realizadas na entidade Usuario.
 * 
 * @author v0rtex
 *
 */
public class UsuarioDAO extends GenericDAO{

	/**
	 * Metodo que realiza a autenticacao no banco.
	 * 
	 * @param login
	 * @param senha
	 * @return
	 */
	public Usuario autenticar(String login, String senha) {
		
		Usuario u = new Usuario();
		em = new JPAUtil().getEntityManager();

		try{
			em.getTransaction().begin();
			
			Query query = em.createQuery("from Usuario u where u.login = :login and u.senha = :senha");
			query.setParameter("login", login);
			query.setParameter("senha", senha);

			//Executa a query para autenticar.
			u = (Usuario) query.getSingleResult();
		}
			
		//Efetua o tratamento para as consultas sem retorno.
		catch (NoResultException e) {
			u = new Usuario();;
		}
		
		//Encerra as conexoes.
		finally {
			em.close();
		}

		return u;
	}
	
	/**
	 * Metodo que recupera um registro da entidade usuario do banco de dados.
	 * 
	 * @param login
	 * @return
	 */
	public Usuario recuperarUsuario(String login) {
		
		Usuario u = null;
		
		em = new JPAUtil().getEntityManager();
		
		try{
			em.getTransaction().begin();
			
			//Monta a query para autenticar o usuario.
			Query query = em.createQuery("from Usuario u where u.login = :login");
			query.setParameter("login", login);

			//Recupera um usuario do banco de dados.
			u = (Usuario) query.getSingleResult();
		}
		//Efetua o tratamento para as consultas sem retorno.
		catch (NoResultException e) {
			TratadorExceptions.tratarNoResultException(e);
			u = null;
		}
		
		//Encerra as conexoes.
		finally {
			em.close();
		}
			
		return u;
	}
	
	/**
	 * Metodo que recupera um registro da entidade usuario do banco de dados.
	 * 
	 * @param id
	 * @return
	 */
	public Usuario recuperarUsuario(Integer id) {
		
		Usuario u = null;
		
		em = new JPAUtil().getEntityManager();
		
		try{
			em.getTransaction().begin();
			
			//Monta a query para autenticar o usuario.
			Query query = em.createQuery("from Usuario u where u.idUsuario = :id");
			query.setParameter("id", Long.parseLong(id.toString()));

			//Recupera um usuario do banco de dados.
			u = (Usuario) query.getSingleResult();
		}
		
		//Efetua o tratamento para as consultas sem retorno.
		catch (NoResultException e) {
			TratadorExceptions.tratarNoResultException(e);
			u = null;
		}
		
		//Encerra as conexoes.
		finally {
			em.close();
		}
			
		return u;
	}

	/**
	 * Lista todos os usuarios cadastrados no sistema.
	 * 
	 * @return
	 */

	public List<Usuario> listarUsuarios() {
		
		List<Usuario> usuarios = new ArrayList<Usuario>();
		
		em = new JPAUtil().getEntityManager();
		
		try {
			em.getTransaction().begin();
			TypedQuery<Usuario> query = em.createNamedQuery("Usuario.FindAll", Usuario.class);		
			usuarios = query.getResultList();
		}
		catch (Exception e) {
			em.getTransaction().rollback();
			TratadorExceptions.tratarExceptionsGerais(e);
		}
		finally {
			em.close();
		}
		
		
		return usuarios;
	}
	
	/**
	 * Metodo que efetua a exclusao de um usuario.
	 * 
	 * @param u
	 */
	public void excluirUsuario(Usuario u) {
		u.setAtivo(false);
		atualizar(u);
	}
}
